perm filename YEAR.SAI[YTD,BGB] blob
sn#051808 filedate 1973-07-03 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00009 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 BEGIN "YEAR"
C00005 00003 α SUBROUTINES OTIME, TOTAL, PRNTOT
C00007 00004 α HEAP SORT
C00011 00005 α FILE OPENING CEREMONIES
C00015 00006 α SCAN'A'LINE OF INPUT LOOP
C00017 00007 α ACCUMULATE GRAND TOTALS
C00020 00008 α PRINT THE CLASS CPU TIME TOTALS
C00022 00009 α CONVERT KILO-CORE-SECONDS INTO AVERAGE JOB SIZE
C00025 ENDMK
C⊗;
BEGIN "YEAR"
REQUIRE "ABBREV[SYS,BGB]" SOURCE_FILE;
REQUIRE "HEAP1D" LOAD_MODULE;
REQUIRE 2000 NEW_ITEMS;
REQUIRE 2000 PNAMES;
DEFINE SUBR="SIMPLE PROCEDURE";
α IO VARIABLES;
INTEGER CNT,BRK,EOF,CHR,FLG,I,J;
STRING LINE;
INTEGER ITEMVAR IPROG;
INTEGER BUG;
α DECLARE ALL THEM PROGRAMMERS;
INTEGER ITEM PM,REB,GAR,GUE,
JWG,MBS, CT,RS1,SLM,BMJ,
MIB,EMC,JMG,MUZ,MUS,TVR,
SYS,REG,JRL,JAM,PJS,SRS,
JHS,DCS,RHT,TES,EHS,JOE,
GJG,AIL,AKC, WD,CCG,IGR,
RLL, ZM,JMC,RGM,SAN,MAL,
BWP,JEV,RWW,PDQ, BO,RBT,
MJH,PLF, SL,JGC,BLF, AH,
MHR,CJR,YAW,GJA,TOB,SHY,
YYY, GG,RKN,RPO,LOU,KKP,
VDS,JAF,BGB,AKI,AJT,DFD,
RPH,H,FW,ELM,PMP,DWP,MJW,TED,
GHB,DGB,KMC,KRD,HJE,ME,FDH,
TM1,HPM,VRP,CKR,EDS,ROG,DAV,JYS,JRB;
α DECLARE MAJOR GROUPS;
SET MUSIC,MARS,ROBOTS,SYSTEMS,MTC,HMF,FOONLY,OTHERS,MT;
DEFINE MUSIC#="1", MARS#="2", ROBOTS#="3", SYSTEMS#="4",
MTC#="5", HMF#="6", FOONLY#="7", MT#="8", OTHERS#="9";
α YEAR TIL DATE DATA FOR EACH PPPN;
DEFINE SIZ = "2000";
SAFE ITG ARRAY PRJ,LOG,TTY,CPU,KCS[1:SIZ],PRG[0:SIZ];
SAFE ITG ARRAY TTY#,CPU#,KCS#[1:SIZ];
INTEGER K,L,M;
INTEGER PPNCNT;
INTEGER ARRAY CLASS[1:500]; α LIKE SCHOOL...;
SUBR OSTR (STRING S); ⊂ OUTSTR(S);OUT(2,S) ⊃;
α SUBROUTINES OTIME, TOTAL, PRNTOT;
α __________________________________________________________________;
SUBR OTIME (INTEGER MINUTES);
BEGIN "OTIME"
INTEGER DAYS,HOURS,MINS;
MINS ← MINUTES MOD 60;
HOURS ← (MINUTES DIV 60) MOD 24;
DAYS ← MINUTES DIV (24*60);
SETFORMAT(4,7); OSTR(CVS(DAYS)&" DAYS ");
SETFORMAT(2,7); OSTR(CVS(HOURS)&":");
SETFORMAT(-2,7);OSTR(CVS(MINS));
END "OTIME";
α __________________________________________________________________;
INTEGER X1,X2,X3;
SUBR TOTAL (INTEGER I);
BEGIN
TTY[I]←TTY[I]+X1;
CPU[I]←CPU[I]+X2;
KCS[I]←KCS[I]+X3;
END;
α __________________________________________________________________;
SUBR PRNTOT (INTEGER I; SET S; STRING STR);
BEGIN
ITEMVAR IPROG;
OSTR(↓&STR&" TOTALS."&↓);
∀ IPROG|IPROGεS DO OSTR(CVIS(IPROG,FLG)&"," );OSTR(↓);
OSTR(" CPU TIME ");
OTIME(CPU[I]%60);
OSTR(9&9&CVS(100*CPU[I]%CPU[SIZ])&" PERCENT OF TOTAL."&↓);
OSTR(" "&CVS(KCS[I])&" KILO CORE SECONDS");
OSTR(9&9&CVS(100*KCS[I]%KCS[SIZ])&" PERCENT OF TOTAL."&↓);
OSTR(" CONSOLE TIME ");
OTIME(TTY[I]);
OSTR(9&9&CVS(100*TTY[I]%TTY[SIZ])&" PERCENT OF TOTAL."&↓);
OSTR(↓);
END;
α __________________________________________________________________;
α HEAP SORT;
α ARRAY-A ARE THE KEYS, ARRAY-B ARE THE RECORDS;
α __________________________________________________________________;
SUBR HEAP1D (ITG ARRAY A,B; INTEGER N);
BEGIN "HEAPSORT"
ITG I,J,K,X,Y;
α PUT'EM UNDER THE HEAP & ALLOW THE BIGGIES TO TRICKLE UP;
FOR K←2 STEP 1 UNTIL N DO
BEGIN
I←K;
X←A[I]; Y←B[I];
WHILE I>1 ∧ X>A[J←I%2] DO
BEGIN A[I]←A[J];B[I]←B[J];I←J END;
A[I]←X;B[I]←Y;
END;
α TAKE 'EM OFF THE TOP & PROMOTE SUBORDINATES;
FOR K←N STEP -1 UNTIL 2 DO
BEGIN
X←A[K];Y←B[K];A[K]←A[1];B[K]←B[1];I←1;
WHILE (J←2*I)<K DO
BEGIN
IF (J+1)<K ∧ A[J+1]>A[J] THEN J←J+1;
IF X≥A[J] THEN DONE ELSE
⊂ A[I]←A[J];B[I]←B[J];I←J ⊃;
END;
A[I]←X;B[I]←Y;
END;
END "HEAPSORT";
α __________________________________________________________________;
α FILE OPENING CEREMONIES;
OUTSTR(↓&↓&"GIGO WARNING !!!"&↓&"
The YTD files on [ACT,SYS] are not quite accurate with
respect to format or sane statistical values. A YTD file must be
inspected and edited before use. Look for ridiculously large values,
negative values, numbers with several decimal points, colons, as
well as for bad PPPN's and missing delimiters."&↓&↓);
OPEN(2,"DSK",0,0,3,0,0,0);ENTER(2,"O",0);
OPEN(1,"DSK",0,3,0,CNT,BRK,EOF);
⊂ STRING FILNAM; OUTSTR(" YTD OR MONTH NAME = ");
FILNAM ← INCHWL;
LOOKUP(1,FILNAM,FLG);
IF FLG THEN LOOKUP(1,FILNAM&"[ACT,SYS]",FLG);
IF FLG THEN ⊂ FILNAM←"YTD";
LOOKUP(1,"YTD[ACT,SYS]",FLG) ⊃;
OSTR(↓&↓&"YEAR TO DATE ANALYSIS OF FILE ");
OSTR(FILNAM&↓&↓);⊃;
α DECLARE SCAN BREAK CHARACTERS;
BREAKSET(1,13,"I");
BREAKSET(1,10,"O");
FOR I←1 TIL 6 DO ⊂ CNT←120;LINE←INPUT(1,1) ⊃;
BREAKSET(2, 9,"I");
BREAKSET(2," ","O");
BREAKSET(3,",]","I");
BREAKSET(3,"[","O");
α PROJECT GROUPS;
MUSIC ← {PM,REB,GAR,JWG,MBS,CT,RS1,SLM,BMJ,JAM,
MIB,EMC,JMG,MUZ,MUS};
SYSTEMS←{SYS,REG,JRL,PJS,SRS,JHS,DCS,FW,AIL,GUE,
RHT,TES,JOE,GJG};
MTC←{AKC,WD,CCG,IGR,RLL,ZM,JMC,RGM,SAN,MAL,BWP,JEV,RWW};
MARS←{PDQ,BO,RBT,MJH,PLF,SL};
ROBOTS←{GJA,TOB,SHY,GG,YYY,RKN,RPO,LOU,KKP,TVR,
VDS,JAF,BGB,AKI,AJT,DFD};
FOONLY←{RPH,H,ELM,PMP,DWP,MJW,TED,EHS};
HMF←{GHB,DGB,KMC,KRD,HJE,ME,FDH,TM1,HPM,VRP,
CKR,EDS,ROG,DAV,JYS,JRB};
MT←{JGC,BLF,AH,MHR,CJR,YAW};
α ASSIGN PROJECT SERIAL NUMBERS;
∀ IPROG | IPROGεMUSIC DO ∂(IPROG) ← SIZ - MUSIC#;
∀ IPROG | IPROGεMARS DO ∂(IPROG) ← SIZ - MARS#;
∀ IPROG | IPROGεSYSTEMS DO ∂(IPROG) ← SIZ - SYSTEMS#;
∀ IPROG | IPROGεROBOTS DO ∂(IPROG) ← SIZ - ROBOTS#;
∀ IPROG | IPROGεMTC DO ∂(IPROG) ← SIZ - MTC#;
∀ IPROG | IPROGεHMF DO ∂(IPROG) ← SIZ - HMF#;
∀ IPROG | IPROGεFOONLY DO ∂(IPROG) ← SIZ - FOONLY#;
∀ IPROG | IPROGεMT DO ∂(IPROG) ← SIZ - MT#;
α SCAN'A'LINE OF INPUT LOOP;
WHILE TRUE DO
BEGIN "INPUT SCAN"
STRING LINE,PPNSTR,PJSTR,PGSTR,LOGSTR,TTYSTR,CPUSTR,KCSSTR;
INTEGER PROGMR,PROJCT;
α READ'A'LINE;
CNT←120;LINE←INPUT(1,1);
IF EOF THEN DONE;
α READ THE PPPN - [PRJ,PRG];
PPNSTR ← SCAN(LINE,2,CHR);
PJSTR ← SCAN(PPNSTR,3,CHR); PROJCT ← INTSCAN(PJSTR,CHR);
PGSTR ← SCAN(PPNSTR,3,CHR); PROGMR ← CVSIX(PGSTR);
α DISTINGUISH A NEW MAN;
IF PROGMR≠PRG[M] THEN ⊂ PRG[M←M+1]←PROGMR; L←0; ⊃;
PRJ[M]←PRJ[M]+1;
L←L+1; PPNCNT←PPNCNT+1;
α READ PPPN'S STATISTICS: LOGINS, CONSOLE h:m, CPU m:s, KCS;
LOGSTR ← SCAN(LINE,2,CHR);
TTYSTR ← SCAN(LINE,2,CHR);
CPUSTR ← SCAN(LINE,2,CHR);
KCSSTR ← SCAN(LINE,2,CHR);
α ACCUMULATE INDIVIDUAL TOTALS;
LOG[M] ← LOG[M] + INTSCAN(LOGSTR,CHR);
X1 ← INTSCAN(TTYSTR,CHR)*60 + INTSCAN(TTYSTR,CHR);
X2 ← INTSCAN(CPUSTR,CHR)*60 + INTSCAN(CPUSTR,CHR);
X3 ← INTSCAN(KCSSTR,CHR);
TTY[M] ← TTY[M] + X1;
CPU[M] ← CPU[M] + X2;
KCS[M] ← KCS[M] + X3;
α ACCUMULATE CLASS TOTALS;
IF PROJCT≥1 ∧ PROJCT≤500 THEN
CLASS[PROJCT] ← CLASS[PROJCT] + X2;
α LOOKUP HIS GROUP NUMBER AND ACCUMULATE GROUP TOTALS;
IPROG ← CVSI(PGSTR,FLG);
IF FLG THEN TOTAL(SIZ-OTHERS#) ELSE TOTAL(∂(IPROG));
END "INPUT SCAN";
RELEASE(1);
OUTSTR("EOF"&↓);
α ACCUMULATE GRAND TOTALS;
J←0; FOR I←1 STEP 1 UNTIL M DO J←J+LOG[I]; LOG[SIZ]←J;
J←0; FOR I←1 STEP 1 UNTIL M DO J←J+TTY[I]; TTY[SIZ]←J;
J←0; FOR I←1 STEP 1 UNTIL M DO J←J+CPU[I]; CPU[SIZ]←J;
J←0; FOR I←1 STEP 1 UNTIL M DO J←J+KCS[I]; KCS[SIZ]←J;
α PRINT GRAND TOTALS;
OSTR("A FICTIONAL YEAR TO DATE ANALYSIS - JAN to JUN 1973.
I have edited Ralph Gorin's YTD[ACT,SYS] file to remove
impossibly large numbers, and numbers printed without delimiters,
and PPPN's and numbers printed with too few or too many delimiters.
Consequently the following analysis is a fiction, and any similarity
between these characters and persons living or dead is a coincidence.
"&↓);
OSTR("RAW GRAND TOTALS."&↓);
SETFORMAT(10,7);
OSTR(" "&CVS(M)&" PROGRAMMERS"&↓);
OSTR(" "&CVS(PPNCNT)&" PPPN'S"&↓);
OSTR(" "&CVS(LOG[SIZ])&" LOGIN'S"&↓);
OSTR(" CONSOLE TIME "&CVS(TTY[SIZ])&" MINUTES"&↓);
OSTR(" CPU TIME "&CVS(CPU[SIZ])&" SECONDS"&↓);
OSTR(" "&CVS(KCS[SIZ])&" KILO CORE SECONDS"&↓);
OSTR(↓);
OSTR("EQUIVALENT GRAND TOTALS."&↓);
OSTR(" CONSOLE TIME ");
OTIME(TTY[SIZ]); OSTR(↓);
OSTR(" CPU TIME ");
OTIME(CPU[SIZ]%60); OSTR(↓);
α PRINT THE GROUP TOTALS;
PRNTOT(SIZ-SYSTEMS#,SYSTEMS, "SYSTEMS AND NET");
PRNTOT(SIZ-ROBOTS#,ROBOTS, "ROBOTICS");
PRNTOT(SIZ-MUSIC#,MUSIC, "MUSIC");
PRNTOT(SIZ-FOONLY#,FOONLY, "FOONLY");
PRNTOT(SIZ-HMF#,HMF, "HIGHER MENTAL FUNCTIONS");
PRNTOT(SIZ-MTC#,MTC, "MATHEMATICAL THEORY OF COMPUTATION");
PRNTOT(SIZ-MT#,MT, "MACHINE TRANSLATION");
PRNTOT(SIZ-MARS#,MARS, "MARS");
PRNTOT(SIZ-OTHERS#,OTHERS, "OTHERS");
α PRINT THE CLASS CPU TIME TOTALS;
OSTR(↓&"TOTAL CPU TIME BY NUMERIC PROJECTS 20 TIL 500"&↓);
OSTR(" which are alleged to be university course numbers."&↓);
FOR I←20 TIL 500 DO
IF CLASS[I]>60 THEN
BEGIN "CLASS"
INTEGER CPUTIM;
OSTR(9&"COURSE #"&CVS(I)&9);
CPUTIM←(CLASS[I])%60;
SETFORMAT(3,7);
OSTR(CVS(CPUTIM%60)&":");
SETFORMAT(-2,7);
OSTR(CVS(CPUTIM MOD 60));
IF I=220 THEN OSTR(9&"MUSIC") ELSE
IF I=206 THEN OSTR(9&"LISP") ELSE
IF I=390 THEN OSTR(9&"ADV READING & RESEARCH") ELSE
IF I=347 THEN OSTR(9&"HIGH SCHOOL HACKER - SMG") ELSE
IF I=225 THEN OSTR(9&"ARTIFICIAL INTELLIGENCE") ELSE
IF I=226 THEN OSTR(9&"REPRESENTATION IN A.I.") ELSE
IF I=256 THEN OSTR(9&"MATHEMATICAL THEORY OF COMPUTATION") ELSE
IF I=293 THEN OSTR(9&"COMPUTER LAB") ELSE
IF I=137 THEN OSTR(9&"NUMERICAL ANALYSIS") ELSE
IF I=140 THEN OSTR(9&"SYSTEMS PROGRAMMING") ELSE
IF I=144 THEN OSTR(9&"DATA STRUCTURES");
OSTR(↓);
END "CLASS";
α CONVERT KILO-CORE-SECONDS INTO AVERAGE JOB SIZE;
FOR I←1 TIL M DO IF CPU[I]>10 THEN
KCS[I] ← (KCS[I] / CPU[I]) ELSE KCS[I]←0; α HIM TOO SMALL;
α SORT ON EACH DATA FIELD;
FOR I←1 TIL M DO TTY#[I]←CPU#[I]←KCS#[I]←I;
HEAP1D(TTY,TTY#,M);
HEAP1D(CPU,CPU#,M);
HEAP1D(KCS,KCS#,M);
α TYPE OUT THE VILLAINS;
OSTR(↓&↓);
OSTR("THE RANK ORDER OF OUTSTANDING USERS"&↓);
OSTR(↓&"RANK CPU-TIME HR:MIN ");
OSTR(9&"AVERAGE-JOB-SIZE CONSOLE-TIME"&↓);
α OUTPUT A LINE OF RANK ORDER;
FOR I←M STEP -1 UNTIL M-200 DO
BEGIN "RANK'A'LINE"
INTEGER CPUTIM;
α RANK ORDER;
SETFORMAT(4,7);OSTR(CVS(M-I+1)&9);
α TOTAL CPU TIME;
OSTR(CVXSTR(PRG[CPU#[I]])&" ");CPUTIM←CPU[I]%60;SETFORMAT(3,7);
OSTR(CVS(CPUTIM%60)&":");SETFORMAT(-2,7);
OSTR(CVS(CPUTIM MOD 60)&9&9);
α AVERAGE JOB SIZE;
SETFORMAT(2,7);
OSTR(CVXSTR(PRG[KCS#[I]])&" ");
OSTR(CVS(KCS[I])&"K"&9&9);
α TOTAL CONSOLE TIME;
OSTR(CVXSTR(PRG[TTY#[I]])&" ");
OTIME((TTY[I]));
OSTR(↓);
END "RANK'A'LINE";
RELEASE(2);
OUTSTR(↓&9&"EOF"&↓);
END "YEAR";